-
Notifications
You must be signed in to change notification settings - Fork 33
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
경북대 Android_유지예_1주차_과제 #10
base: yjy1220
Are you sure you want to change the base?
Conversation
git의 커밋 스쿼시를 잘 활용해보세요. |
val name: String, | ||
val phone: String, | ||
val email: String?, | ||
val birth: String?, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
날짜를 좀 더 직접적으로 나타내는 Date나 Kotlin.date.Instant 에 대해서도 알아보면 어떨까 합니다. :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아하, 날짜를 더 직접적으로 나타내는 방법이 있었는지 몰랐습니다. 더 공부해보겠습니다. 감사합니다!
val moreLayout = findViewById<LinearLayout>(R.id.moreLayout) | ||
val moreText = findViewById<TextView>(R.id.moreText) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
메소드를 실행시킬때마다 비싼 xml 파싱을 통해 뷰를 탐색해내는 findViewBy 를 실행하는 것이 아닌,
액티비티가 열렸을때 one-time만 이것들을 호출하여 필드 인스턴스를 할당하고 그것을 계속 재사용하는게 성능측면에서 더 좋아보입니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
b40e90a
따로 빼서 한 번만 호출 후 재사용하는 식으로 수정했습니다!
selectedDate.set(year, month, day) | ||
val setting = SimpleDateFormat("yyyy.MM.dd", Locale.getDefault()) | ||
val formDate = setting.format(selectedDate.time) | ||
findViewById<TextView>(R.id.birthText).text = formDate |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
런타임 성능에 영향을 줄수있습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
e9cdf63
이전 커밋에서 findViewById를 한번만 호출하도록 수정해서 birthText부분도 런타임성능에 영향을 주지 않도록 변경했습니다. 커밋을 두 번 나누어 진행했습니다!
val nameText = findViewById<EditText>(R.id.nameText) | ||
val phoneText = findViewById<EditText>(R.id.phoneText) | ||
val emailText = findViewById<EditText>(R.id.emailText) | ||
val birthText = findViewById<TextView>(R.id.birthText) | ||
val memoText = findViewById<EditText>(R.id.memoText) | ||
val moreLayout = findViewById<LinearLayout>(R.id.moreLayout) | ||
val moreText = findViewById<TextView>(R.id.moreText) | ||
val cancelButton = findViewById<Button>(R.id.cancelButton) | ||
val saveButton = findViewById<Button>(R.id.saveButton) | ||
val genderRadio = findViewById<RadioGroup>(R.id.genderRadio) | ||
val femaleButton = findViewById<RadioButton>(R.id.femaleButton) | ||
val maleButton = findViewById<RadioButton>(R.id.maleButton) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
private 필드변수화 필요.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
e81c6e9
private 필드변수화 완료했습니다.
여러 개를 한번에 수정하다보니 하나의 커밋에 기능 변경사항이 여러개가 되었는데 다음부터는 하나의 커밋에 하나의 변경사항만 담겠습니다..!
resultIntent.putExtra("contact", contact) | ||
setResult(RESULT_OK, resultIntent) | ||
|
||
Toast.makeText(this, "저장되었습니다.", Toast.LENGTH_SHORT).show() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"저장되었습니다." String은 추후에 영어등의 다른 언어로 번역해서 쓰일수있으니 strings.xml에서 관리하는게 어떨까요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
e81c6e9
strings.xml에서 관리하도록 변경했습니다!
|
||
//intent로 결과 반환 | ||
val resultIntent = Intent() | ||
resultIntent.putExtra("contact", contact) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
보통 이런 요소는 Constant라는 object를 파일단위로 생성하고
const val NAV_KEY_POSITION = "contact"를 변수로 세팅하여 사용합니다.
그리고 받는쪽에서도 이것을 사용하는거죠.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
객체 자체를 넣기보다는 전화번호부의 키값이 될만한 별도의 id 값이나, 혹은 현재까지 세팅된 것중에서는 phone 번호만 넘기고 넘어가는 다음페이지에서 해당 정보를가지고 쿼리를 하듯이 별도로 Contact를 로드해오는게 이상적으론 더 나은 구현이긴합니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
넵, 다음엔 그렇게 구현해보겠습니다..! 더 코드가 깔끔해질 것 같습니다. 감사합니다!
val memoLabelText = findViewById<TextView>(R.id.memoLabelText) | ||
|
||
//parcel에 적어서 intent로 전달된 contact 객체 가져오기 | ||
val contact = intent.getParcelableExtra<Contact>("contact") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Parcelable을 써보는것도 좋지만, 여러 객체중 측정 객체를 식별해낼수있는 key 개념만을 전달하고 받아서 동일한 기능을 처리하는 방식으로 로직을 구성해보면 좋겠습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
구현 시에는 하나에만 꽂혀서 해당 로직 방법을 생각해보지 못했었습니다. 다음엔 해당 로직처럼 구성해보겠습니다. 감사합니다!
class ContactsAdapter ( | ||
//contact 객체 데이터 저장 | ||
val contacts : List<Contact>, | ||
val clickListner : (Contact) -> Unit |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(Contact) -> Unit 람다 형태로 이벤트를 처리하는게 꼭 필요했을까요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
단순히 조금 더 깔끔할 거라고 생각해서 작성했습니다.
다음부터는 더 신중히 생각해보고 작성하겠습니다.
<RadioGroup | ||
android:id="@+id/genderRadio" | ||
android:layout_width="match_parent" | ||
android:layout_height="wrap_content" | ||
android:orientation="horizontal"> | ||
|
||
<!-- female radio --> | ||
<RadioButton | ||
android:id="@+id/femaleButton" | ||
android:layout_width="wrap_content" | ||
android:layout_height="wrap_content" | ||
android:text="여성" /> | ||
|
||
<!-- male radio --> | ||
<RadioButton | ||
android:id="@+id/maleButton" | ||
android:layout_width="wrap_content" | ||
android:layout_height="wrap_content" | ||
android:text="남성" /> | ||
</RadioGroup> | ||
</LinearLayout> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이부분이 더럽다고 생각하신걸까요~?
커스텀뷰를 배운다면 이런걸 직접 정의한 View 클래스를 이용해서 해결할수도 있겠지만 지금은 이정도도 충분히 최선이라고 생각합니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
라디오그룹을 맨 끝으로 보내기위해서는 이런 코드를 작성하면 해결이 될것으로 보이네요.
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/genderText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="성별"
android:textColor="@android:color/darker_gray"
android:padding="10dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/genderRadio"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
<RadioGroup
android:id="@+id/genderRadio"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toEndOf="@id/genderText"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent">
<!-- female radio -->
<RadioButton
android:id="@+id/femaleButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="여성" />
<!-- male radio -->
<RadioButton
android:id="@+id/maleButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="남성" />
</RadioGroup>
</androidx.constraintlayout.widget.ConstraintLayout>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
e81c6e9
위의 xml파일처럼 수정했습니다. 감사합니다!
if(moreLayout.visibility == LinearLayout.GONE){ | ||
moreLayout.visibility = LinearLayout.VISIBLE | ||
moreText.visibility = TextView.GONE | ||
} | ||
else { | ||
moreLayout.visibility = LinearLayout.GONE | ||
moreText.visibility = TextView.VISIBLE | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Activity에서 이런 처리에 대한 책임이 있는것이 문제가 있는건 아닙니다.
걱정하지 말고 이런 로직을 넣으셔도 된다고 생각합니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아하 넵, 알겠습니다! 감사합니다!
1단계
1단계 커밋 링크
https://github.com/kakao-tech-campus-2nd-step2/android-contacts/pull/10/files/e0fa7b57b218306e3f2a6ee34359abe9ae9f3f22
코드 작성 시 어려웠던 점
코드 리뷰 시 멘토님께서 중점적으로 봐주셨으면 하는 부분
2단계
2단계 커밋 링크
https://github.com/kakao-tech-campus-2nd-step2/android-contacts/pull/10/files/e0fa7b57b218306e3f2a6ee34359abe9ae9f3f22..e9e8ec968748d5f2efdb438d96e3a1f8f869bce2
코드 작성 시 어려웠던 점
코드 리뷰 시 멘토님께서 중점적으로 봐주셨으면 하는 부분
과제 후 느낀 점
이번 과제는 정말 쉽지 않았던 거 같습니다. 제 실력이 부족해서겠지만 모르는 것도 많았고 하나의 코드를 구현하기 위해서 찾아봐야하는 개념이 더 많았던 과제 같습니다. 과제를 하기 전보다 확실히 지식이 늘어난 느낌이긴 하지만 클린코드 작성과 기능별 커밋기록 등 기본적인게 아직 많이 부족하다고 느낍니다. 다음 과제에서는 더 나아진 모습을 보일 수 있었으면 좋겠습니다.
구현 화면
실행 영상 (전체 실행영상)
[https://youtu.be/re7rHcPNlhE](https://youtu.be/UEXYAcABTMc)